#include "control.h"

// === 构造函数实现 ===
controller::controller(Ui_Dictionary& ui,
        database& db,
        history& his)
    : ioSearchEdit(ui.searchEdit),     // 初始化搜索框
      ioSearchButton(ui.searchButton), // 初始化搜索按钮
      ioHistoryButton(ui.historyButton), // 必须添加这行初始化历史按钮
      ioDefinitionText(ui.definitionText), // 初始化显示区域
      ioWordLists(ui.wordList),
      ioUi(&ui)
{
    ioDatabase = &db;  // 设置数据库对象
    ioHistroy = &his;  // 设置历史记录对象

    Word = new QString();  // 分配内存

    // 初始化搜索定时器（100ms间隔）
    timer = new QTimer(this);
    timer->setInterval(150);
    timer->start();

    connect();  // 建立信号槽连接
}

// === 搜索功能实现 ===

// 获取当前搜索框内容
void controller::getSearchWord(){
    *Word = ioSearchEdit->text();  // 获取当前搜索词
}

// 执行精确单词搜索（回车/按钮触发）
void controller::searchWord() {
    QString result=ioDatabase->searchWord(*Word).word+"\n"
    +ioDatabase->searchWord(*Word).pronunciation+"\n"
    +ioDatabase->searchWord(*Word).meaning;
    ioDefinitionText->setText(result);
    addHistory();
    std::cerr << "Search for word!-----" << std::endl;
}

// 执行列表模糊搜索（定时器触发）
void controller::searchLists() {
    // 清空当前列表
    ioUi->wordList->clear();  // 假设 ui 是您的 Ui_Dictionary 对象
    // 获取单词列表
    QVector<QString> strs = ioDatabase->getNext20Words(*Word);
    // 添加单词到列表控件
    for (const auto& word : strs) {
        QListWidgetItem *item = new QListWidgetItem(word);
        ioUi->wordList->addItem(item);

        // 可选：输出到控制台
        std::cout << word.toStdString() << std::endl;
    }
    std::cerr << "Search for lists completed!-----" << std::endl;
}


void controller::showHistory() {
    // 清空当前列表
    ioUi->wordList->clear();  // 假设 ui 是您的 Ui_Dictionary 对象
    // 获取单词列表
    QStringList strs = ioHistroy->getAllWords();
    // 添加单词到列表控件
    for (const auto& word : strs) {
        QListWidgetItem *item = new QListWidgetItem(word);
        ioUi->wordList->addItem(item);

        // 可选：输出到控制台
        std::cout << word.toStdString() << std::endl;
    }
    std::cerr << "History for lists completed!-----" << std::endl;
}

void controller::addHistory() {
    ioHistroy->addWord(*Word);
}


// === 信号槽连接实现 ===
void controller::connect() {
    // 回车键触发精确搜索
    QObject::connect(ioSearchEdit, &QLineEdit::returnPressed, [&]() {
        getSearchWord();
        searchWord();
    });
    
    // 搜索按钮触发精确搜索
    QObject::connect(ioSearchButton, &QPushButton::clicked, [&]() {
        getSearchWord();
        searchWord();
    });
    
    // 定时器触发模糊搜索（当内容变化时）
    QObject::connect(timer, &QTimer::timeout, [&]() {
        if(ioSearchEdit->text().length() > 0 && *Word != ioSearchEdit->text()) {
            getSearchWord();
            searchLists();
        }
    });

    QObject::connect(ioUi->wordList, &QListWidget::itemClicked, [&](QListWidgetItem* item) {
        *Word= item->text();
        searchWord();
    });

    QObject::connect(ioHistoryButton, &QPushButton::clicked, [&]() {
    showHistory();
    });
}